package com.unionftech.baselibrary.glide.core

import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import com.bumptech.glide.load.Transformation
import com.unionftech.baselibrary.glide.progress.OnProgressListener

/**
 * 图片加载库的配置，封装原始加载配置属性，进行转换
 */
class ImageOptions {
    /**
     * 加载原始资源
     */
    var res: Any? = null

    /**
     * 图片显示容器
     */
    var imageView: ImageView? = null

    /**
     * 上下文对象
     */
    var context: Any? = null
        get() {
            return field ?: imageView
        }

    /**
     * 图片占位图配置
     */
    var drawableOptions: DrawableOptions = DrawableOptions.DEFAULT

    /**
     * 主动设置图片占位信息
     */
    inline fun setDrawableOptions(options: DrawableOptions.() -> Unit) {
        drawableOptions = drawableOptions.copy().also(options)
    }

    /**
     * 加载占位图资源ID,如果是0则没有占位图
     */
    @DrawableRes
    var placeHolderResId: Int = 0
        get() = TODO()
        set(value) {
            setDrawableOptions { placeHolderResId = value }
            field = value
        }

    var placeHolderDrawable: Drawable?
        get() = TODO()
        set(value) {
            setDrawableOptions { placeHolderDrawable = value }
        }

    /**
     * 设置错误占位图资源ID
     */
    var errorResId = 0
        get() = TODO()
        set(value) {
            setDrawableOptions { errorResId = value }
            field = value
        }
    var errorDrawable: Drawable?
        get() = TODO()
        set(value) {
            setDrawableOptions { errorDrawable = value }
        }

    /**
     * 请求url为空占位图资源ID
     */
    @DrawableRes
    var fallbackResId = 0
        get() = TODO()
        set(value) {
            setDrawableOptions { fallbackResId = value }
            field = value
        }

    var fallbackDrawable: Drawable?
        get() = TODO()
        set(value) {
            setDrawableOptions { fallbackDrawable = value }
        }

    /**
     * 是否渐隐加载
     */
    var isCrossFade = true

    /**
     * 是否跳过内存加载
     */
    var skipMemoryCache = false

    /**
     * 是否使用动画，默认使用
     */
    var isAnim = true

    /**
     * 磁盘缓存
     */
    var diskCacheStrategy = DiskCache.AUTOMATIC

    /**
     * 加载优先级
     */
    var priority = LoadPriority.NORMAL

    /**
     * 缩略图
     */
    var thumbnail: Float = 0f

    /**
     * 缩略图链接
     */
    var thumbnailUrl: Any? = null

    /**
     * 图片尺寸
     */
    var size: OverrideSize? = null

    /**
     * 圆形图片
     * Glide加载时需要将isCrossFade设置为false
     */
    var isCircle: Boolean = false

    var isGray: Boolean = false

    /**
     * 是否中间裁剪展示
     */
    var centerCrop: Boolean = false

    var isFitCenter: Boolean = false

    /**
     * 圆形是否带边框
     */
    var format: Bitmap.Config? = null

    /**
     * 圆形是边框的宽度
     */
    var borderWidth: Int = 0

    /**
     * 圆形边框颜色
     */
    @ColorInt
    var borderColor: Int = Color.TRANSPARENT

    /**
     * 模糊效果
     * Glide加载时需要将isCrossFade设置为false
     */
    var isBlur: Boolean = false

    /**
     * 模糊半径
     */
    var blurRadius: Int = 25

    /**
     * 缩放系数 加速模糊速度
     */
    var blurSampling: Int = 4

    /**
     * 是否圆角
     * Glide加载时需要将isCrossFade设置为false
     */
    var isRoundedCorners: Boolean = false

    /**
     * 圆角的弧度
     */
    var roundRadius: Int = 0

    /**
     * 圆角的方向
     */
    var cornerType: CornerType = CornerType.ALL

    /**
     * 转换器
     */
    var transformation: Array<out Transformation<Bitmap>>? = null

    /**
     * 图片网络加载进度监听
     */
    var onProgressListener: OnProgressListener = null
        private set

    fun progressListener(listener: OnProgressListener) {
        this.onProgressListener = listener
    }

    /**
     * 加载监听
     */
    var requestListener: OnImageListener? = null
        private set

    fun requestListener(listener: OnImageListener.() -> Unit) {
        requestListener = OnImageListener().also(listener)
    }

    data class DrawableOptions(
        //加载占位图资源ID,如果placeHolderRes为0表示没有占位图
        @DrawableRes var placeHolderResId: Int = 0,
        var placeHolderDrawable: Drawable? = null,
        //错误占位图资源ID
        @DrawableRes var errorResId: Int = 0,
        var errorDrawable: Drawable? = null,
        //请求url为空占位图资源ID
        @DrawableRes
        var fallbackResId: Int = 0,
        var fallbackDrawable: Drawable? = null
    ) {
        companion object {
            var DEFAULT = DrawableOptions()

            @JvmStatic
            inline fun setDefault(options: DrawableOptions.() -> Unit) {
                DEFAULT = DEFAULT.also(options)
            }
        }
    }

    /**
     * 指定加载图片的大小
     */
    class OverrideSize(val width: Int, val height: Int)

    /**
     * 图片缓存策略
     */
    enum class DiskCache(val strategy: Int) {
        //没有缓存
        NONE(1),

        //根据原始图片数据和资源编码策略来自动选择磁盘缓存策略，需要写入权限
        AUTOMATIC(2),

        //在资源解码后将数据写入磁盘缓存，即经过缩放等转换后的图片资源
        RESOURCE(3),

        //在资源解码前就将原始数据写入磁盘缓存，需要写入权限
        DATA(4),

        //使用DATA和RESOURCE缓存远程数据，仅使用RESOURCE来缓存本地数据，需要写入权限
        ALL(5)
    }

    /**
     * 加载优先级策略
     * 指定了图片加载的优先级后，加载时会按照图片的优先级进行顺序加载
     * IMMEDIATE优先级时会直接加载，不需要等待
     */
    enum class LoadPriority(val priority: Int) {
        //低优先级
        LOW(1),

        //普通优先级
        NORMAL(2),

        //高优先级
        HIGH(3),

        //立即执行
        IMMEDIATE(4)
    }

    enum class CornerType {
        ALL,
        TOP_LEFT,
        TOP_RIGHT,
        BOTTOM_LEFT,
        BOTTOM_RIGHT,
        TOP,
        BOTTOM,
        LEFT,
        RIGHT,
        OTHER_TOP_LEFT,
        OTHER_TOP_RIGHT,
        OTHER_BOTTOM_LEFT,
        OTHER_BOTTOM_RIGHT,
        DIAGONAL_FROM_TOP_LEFT,
        DIAGONAL_FROM_TOP_RIGHT
    }
}